package cn.biplam.back.sql.ddl;

import java.io.Serializable;
import java.util.Map;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;

/**
 * SQL DDL 语义模型 外键关系
 * <ul>外键关系的属性有：
 * <li> 外键表
 * <li> 主键表
 * <li> 主键字段和外键字段映射关系
 * </ul>
 * 
 * @author 	WangSong 2009-5-5 上午09:37:20
 * @version 1.0
 */
public class FK implements Serializable {
	
	private static final long serialVersionUID = 7878014878520223007L;
	
	private String sFkName;
	/**外键表名称*/
	private String sFkTableName;
	/**主键表名称*/
	private String sPkTableName;
	/**字段映射<外键字段物理名称,主键字段物理名称*/
	private KvMap<String, String> kvmColumns;
	
	/**
	 * 构造方法
	 * @param sFkname			外键名称
	 * @param sFkPkName			外键依赖的主键名称
	 * @param sFkPkTableName	外键依赖的主键表名称
	 * @param sFkPkColumnName	外键依赖的主键字段名
	 * @param sFkTableName		外键所在表名称
	 * @param sFkColumnName		外键字段名称
	 * @param FkKeySeq			外键字段序号
	 * @deprecated
	 * @throws ErrorMessage 
	 */
	public FK(String sFkname,String sFkPkName,String sFkPkTableName,String sFkPkColumnName,
			String sFkTableName,String sFkColumnName,String FkKeySeq) throws ErrorMessage{
		throw new ErrorMessage("该方法已经停止使用，请更新程序.");
	}
	
	/**
	 * 构造方法 (所有名称参数不允许为空)
	 * @param sFkname		外键名称
	 * @param sFkTableName	外键表名称
	 * @param sPkTableName	主键表名称
	 * @throws ErrorMessage
	 */
	public FK(String sFkname,String sFkTableName,String sPkTableName) throws ErrorMessage{
		if(sFkname==null || "".equals(sFkname)){
			throw new ErrorMessage("FK name is null!");
		}
		if(sFkTableName==null || "".equals(sFkTableName)){
			throw new ErrorMessage("FkTableName is null!");
		}
		if(sPkTableName==null || "".equals(sPkTableName)){
			throw new ErrorMessage("PkTableName is null!");
		}
		this.sFkName=sFkname;
		this.sFkTableName=sFkTableName;
		this.sPkTableName=sPkTableName;
		this.kvmColumns=new KvMap<String, String>();
	}
	
	/**
	 * 设置外键的物理、逻辑名称
	 * @param physicalName  外键的物理名称
	 * @param logicName		外键的逻辑名称
	 */
	public void setName(String sFkName) {
		this.sFkName = sFkName;	
	}
	
	/**
	 * 返回外键物理名称
	 * @return 外键物理名称
	 */
	public String getName() {
		return this.sFkName;
	}

	/**
	 * 返回外键所依赖的主键表
	 * @return 主键表名称
	 */
	public String getPkTableName() {
		return this.sPkTableName;
	}

	/**
	 * 返回外键所在的的表名称
	 * @return	表名称
	 */
	public String getFkTableName() {
		return sFkTableName;
	}
	
	/**
	 * 返回外键所依赖的主键列容器
	 * @return 主键列名称
	 */
	public KvMap<String, String> getPkColumnName() {
		return this.kvmColumns;
	}
	
	/**
	 * 返回对应的主键字段名称
	 * @param sFkColumnName	外键字段名称
	 * @return
	 */
	public String getPkColumnName(String sFkColumnName){
		return this.kvmColumns.getByKey(sFkColumnName);
	}
	
	/**
	 * 返回对应的外键字段名称
	 * @param sPkColumnName	主键字段名称
	 * @return
	 */
	public String getFkColumnName(String sPkColumnName){
		return this.kvmColumns.getByValue(sPkColumnName);
	}
	
	/**
	 * 返回逗号分隔的外键字段名列表
	 * @return
	 */
	public String getFkColumnNames(){
		StringBuilder sb = new StringBuilder();
		for(Map.Entry<String, String>ite:this.kvmColumns){
			sb.append(ite.getKey());
			sb.append(',');
		}
		sb.delete(sb.length()-1, sb.length());
		return sb.toString();
	}
	
	/**
	 * 返回逗号分隔的主键字段名列表
	 * @return
	 */
	public String getPkColumnNames(){
		StringBuilder sb = new StringBuilder();
		for(Map.Entry<String, String>ite:this.kvmColumns){
			sb.append(ite.getValue());
			sb.append(',');
		}
		sb.delete(sb.length()-1, sb.length());
		return sb.toString();
	}
	
	/**
	 * 放入一个外键字段对应关系
	 * @param sFkColumnName	外键字段名称
	 * @param sPkColumnName	主键字段名称
	 * @throws ErrorMessage
	 */
	public void putFkColumn(String sFkColumnName,String sPkColumnName) throws ErrorMessage{
		this.kvmColumns.put(sFkColumnName, sPkColumnName);
	}
}
